/**
 * Copyright (c) 2020-${YEAR} 宁波哥爱帮科技有限公司
 */
package cn.grab.fispservice.system.controller;

import com.fontana.base.annotation.MyRequestBody;
import com.fontana.base.result.Pagination;
import com.fontana.base.result.Result;
import com.fontana.base.result.ResultCode;
import com.fontana.db.object.MyOrderParam;
import com.fontana.db.object.MyPageParam;
import com.fontana.db.util.MyModelUtil;
import com.fontana.db.util.MyPageUtil;
import com.fontana.util.lang.ObjectUtil;
import com.fontana.util.validate.ValidateUtil;
import com.github.pagehelper.page.PageMethod;
import io.swagger.annotations.Api;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestParam;
import cn.grab.fispservice.system.model.SysDict;
import cn.grab.fispapi.system.dto.SysDictDTO;
import cn.grab.fispapi.system.vo.SysDictVO;
import cn.grab.fispservice.system.service.SysDictService;
import com.fontana.db.service.IBaseService;
import com.fontana.db.controller.AbstractBaseController;

import java.util.List;


/**
 * 字典表 控制器
 *
 * @author Auto
 * @since 2023-01-11
 */
@Api(tags = "字典表接口")
@RestController
@RequestMapping("/sysdict")
public class SysDictController extends AbstractBaseController<SysDictDTO, SysDict, SysDictVO, Long> {
    @Autowired
    private SysDictService sysDictService;

    @Override
    protected IBaseService<SysDict, Long> service() {
        return sysDictService;
    }

    /**
     * 新增数据。
     *
     * @param sysDictDTO 新增对象。
     * @return 应答结果对象，包含新增对象主键Id。
     */
    @ApiOperationSupport(ignoreParameters = {"sysDictDTO.id"})
    @PostMapping("/add")
    public Result<Long> add(@MyRequestBody SysDictDTO sysDictDTO) {
        String errorMessage = ValidateUtil.getModelValidationError(sysDictDTO, false);
        if (errorMessage != null) {
            return Result.failed(ResultCode.DATA_VALIDATED_FAILED, errorMessage);
        }
        //SysDict sysDict = MyModelUtil.copyTo(sysDictDTO, SysDict.class);
        SysDict sysDict = SysDict.INSTANCE.toModel(sysDictDTO);

        sysDict = sysDictService.saveNew(sysDict);
        return Result.succeed(sysDict.getId());
    }

    /**
     * 更新SysDict数据。
     *
     * @param sysDictDTO 更新对象。
     * @return 应答结果对象。
     */
    @PostMapping("/update")
    //标记每次都删除缓存
    @CacheEvict(value = "sysDict", key = "#sysDictDTO.id")
    public Result<Void> update(@MyRequestBody SysDictDTO sysDictDTO) {
        String errorMessage = ValidateUtil.getModelValidationError(sysDictDTO, true);
        if (errorMessage != null) {
            return Result.failed(ResultCode.DATA_VALIDATED_FAILED, errorMessage);
        }
        //SysDict sysDict = MyModelUtil.copyTo(sysDictDTO, SysDict.class);
        SysDict sysDict = SysDict.INSTANCE.toModel(sysDictDTO);

        SysDict originalSysDict = sysDictService.getById(sysDict.getId());
        if (originalSysDict == null) {
            // NOTE: 修改下面方括号中的话述
            errorMessage = "数据验证失败，当前 [数据] 并不存在，请刷新后重试！";
            return Result.failed(ResultCode.DATA_NOT_EXIST, errorMessage);
        }
        if (!sysDictService.update(sysDict)) {
            return Result.failed(ResultCode.DATA_NOT_EXIST);
        }
        return Result.succeed();
    }

    /**
     * 列出符合过滤条件的SysDict列表。
     *
     * @param sysDictDTOFilter 过滤对象。
     * @param orderParam 排序参数。
     * @param pageParam 分页参数。
     * @return 应答结果对象，包含查询结果集。
     */
    @PostMapping("/list")
    public Result<Pagination<SysDictVO>> list(
            @MyRequestBody SysDictDTO sysDictDTOFilter,
            @MyRequestBody MyOrderParam orderParam,
            @MyRequestBody MyPageParam pageParam) {
        if (pageParam != null) {
            PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize());
        }
        //SysDict sysDictFilter = MyModelUtil.copyTo(sysDictDTOFilter, SysDict.class);
        SysDict sysDictFilter = SysDict.INSTANCE.toModel(sysDictDTOFilter);
        String orderBy = MyOrderParam.buildOrderBy(orderParam, SysDict.class);
        List<SysDict> sysDictList = sysDictService.getSysDictList(sysDictFilter, orderBy);
        return Result.succeed(MyPageUtil.makeResponseData(sysDictList, SysDict.INSTANCE));
    }

    /**
     * 查看指定SysDict详情。
     *
     * @param id 指定对象主键Id。
     * @return 应答结果对象，包含对象详情。
     */
    @GetMapping("/view")
    //判断缓存没有就执行方法更新缓存，缓存有就直接返回缓存的值
    @Cacheable(value = "sysDict", key = "#id")
    public Result<SysDictVO> view(@RequestParam Long id) {
        if (ObjectUtil.isAnyBlankOrNull(id)) {
            return Result.failed(ResultCode.PARAM_IS_BLANK);
        }
        SysDict sysDict = sysDictService.getById(id);
        if (sysDict == null) {
            return Result.failed(ResultCode.DATA_NOT_EXIST);
        }
        SysDictVO sysDictVo = SysDict.INSTANCE.fromModel(sysDict);
        return Result.succeed(sysDictVo);
    }

    /**
     * 删除SysDict数据。
     *
     * @param id 删除对象主键Id。
     * @return 应答结果对象。
     */
    @PostMapping("/delete")
    //标记删除缓存
    @CacheEvict(value = "sysDict", key = "#id")
    public Result<Void> delete(@MyRequestBody Long id) {
        String errorMessage;
        if (ObjectUtil.isBlankOrNull(id)) {
            return Result.failed(ResultCode.PARAM_IS_BLANK);
        }
        // 验证关联Id的数据合法性
        SysDict originalSysDict = sysDictService.getById(id);
        if (originalSysDict == null) {
            // NOTE: 修改下面方括号中的话述
            errorMessage = "数据验证失败，当前 [对象] 并不存在，请刷新后重试！";
            return Result.failed(ResultCode.DATA_NOT_EXIST, errorMessage);
        }
        if (!sysDictService.remove(id)) {
            errorMessage = "数据操作失败，删除的对象不存在，请刷新后重试！";
            return Result.failed(ResultCode.DATA_NOT_EXIST, errorMessage);
        }
        return Result.succeed();
    }


}
